/**
 * 
 */
package org.swing.utility.jai.shape;

import java.awt.BasicStroke;
import java.awt.BorderLayout;
import java.awt.Canvas;
import java.awt.Color;
import java.awt.Container;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.GridLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.geom.Area;
import java.awt.geom.Ellipse2D;
import java.awt.geom.GeneralPath;

import javax.swing.ButtonGroup;
import javax.swing.JApplet;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.JRadioButton;

/**
 * @author lqnhu
 *
 */
public class TArea extends JApplet implements ActionListener {
	DrawingCanvas canvas;

	JRadioButton addButton, subtractButton, intersectButton, exclusiveORButton,
			resetButton;

	public static void main(String[] a) {
		JFrame f = new JFrame();
		TArea area = new TArea();
		area.init();
		f.getContentPane().add(area);
		f.setDefaultCloseOperation(1);
		f.setSize(650, 450);
		f.setVisible(true);
	}

	public void init() {
		Container container = getContentPane();

		JPanel panel = new JPanel();
		panel.setLayout(new GridLayout(2, 2));

		resetButton = new JRadioButton("Reset", true);

		addButton = new JRadioButton("Add");
		subtractButton = new JRadioButton("Subtract");
		intersectButton = new JRadioButton("Intersect");
		exclusiveORButton = new JRadioButton("ExclusiveOR");

		ButtonGroup group = new ButtonGroup();
		group.add(resetButton);
		group.add(addButton);
		group.add(subtractButton);
		group.add(intersectButton);
		group.add(exclusiveORButton);
		group.add(resetButton);

		resetButton.addActionListener(this);
		addButton.addActionListener(this);
		subtractButton.addActionListener(this);
		intersectButton.addActionListener(this);
		exclusiveORButton.addActionListener(this);

		panel.add(addButton);
		panel.add(subtractButton);
		panel.add(intersectButton);
		panel.add(exclusiveORButton);

		container.add(panel, BorderLayout.NORTH);
		container.add(resetButton, BorderLayout.SOUTH);

		canvas = new DrawingCanvas();
		container.add(canvas);
	}

	class DrawingCanvas extends Canvas {
		GeneralPath gp;

		Ellipse2D ellipse;

		Area area1, area2;

		boolean drawFlag = true;

		boolean fillFlag = false;

		public DrawingCanvas() {
			setBackground(Color.white);
			setSize(350, 250);
			int w = getWidth();
			int h = getHeight();

			gp = new GeneralPath();
			gp.moveTo(w / 8, h / 2);
			gp.lineTo(w / 2, h / 4);
			gp.lineTo(7 * w / 8, h / 2);
			gp.lineTo(w / 2, 3 * h / 4);
			gp.closePath();
			area1 = new Area(gp);

			ellipse = new Ellipse2D.Double(w / 4, h / 4, w / 2, h / 2);
			area2 = new Area(ellipse); // Ellipse area object
		}

		public void paint(Graphics g) {
			Graphics2D g2D = (Graphics2D) g;
			g2D.setStroke(new BasicStroke(2.0f));

			if (drawFlag) {
				g2D.draw(area1);
				g2D.draw(area2);
			}
			if (fillFlag)
				g2D.fill(area1);
		}
	}

	public void actionPerformed(ActionEvent e) {
		JRadioButton temp = (JRadioButton) e.getSource();

		if (temp.equals(addButton)) {
			canvas.area1 = new Area(canvas.gp);
			canvas.area1.add(canvas.area2);
			canvas.drawFlag = false;
			canvas.fillFlag = true;
			canvas.repaint();
		} else if (temp.equals(subtractButton)) {
			canvas.area1 = new Area(canvas.gp);
			canvas.area1.subtract(canvas.area2);
			canvas.drawFlag = false;
			canvas.fillFlag = true;
			canvas.repaint();
		} else if (temp.equals(intersectButton)) {
			canvas.area1 = new Area(canvas.gp);
			canvas.area1.intersect(canvas.area2);
			canvas.drawFlag = false;
			canvas.fillFlag = true;
			canvas.repaint();
		} else if (temp.equals(exclusiveORButton)) {
			canvas.area1 = new Area(canvas.gp);
			canvas.area1.exclusiveOr(canvas.area2);
			canvas.drawFlag = false;
			canvas.fillFlag = true;
			canvas.repaint();
		} else if (temp.equals(resetButton)) {
			if (canvas.drawFlag == false) {
				canvas.area1 = new Area(canvas.gp);
				canvas.drawFlag = true;
				canvas.fillFlag = false;
				canvas.repaint();
			}
		}
	}
}
